#pragma once
#include "config.h"
#include "timer.h"
#include "touch.h"
#include "display.h"
#include "GPIO.h"
#include "delay.h"
#include "UART.h"
#include "buzzer.h"
#include "modbus.h"
#include "storage.h"
#include "irm.h"
#include "ntc.h"
#include "output.h"
#include "error.h"

/* 是否输出调试信息 */
#define DEBUG_ENABLE                            (1)
/* 默认参数 */
#define PARAMS2MEMORY_SIZE                      (23)                        //参数存储区大小
#define MEMORY_ADDR_START                       (0X00)

#define MODBUS_ADDRESS_DEFAULT                  (0x01)                      //默认通讯地址
#define MODBUS_BAUDRATE_DEFAULT                 MODBUS_BAUDRATE_9600        //默认波特率
#define BACKLIGHT_LUMINANCE_LEVEL_DEFAULT       (7)                         //默认亮度        
#define RELAY_MODE_DEFAULT                      RELAY_MODE_AIR_CONDITIONER  //默认继电器模式           
#define TEMPERATURE_AIR_SET_DEFAULT             (25)                        //默认空调设置温度
#define AIR_CONDITIONER_SPEED_SET_DEFAULT       SET_WIND_SPEED_AUTO         //默认空调风速
#define AIR_CONDITIONER_MODE_SET_DEFAULT        AIR_CONDITIONER_MODE_COOLING//默认空调模式
#define AIR_CONDITIONER_MODE_SUPPORTED_DEFAULT  (AIR_CONDITIONER_SUPPORT_COOLING_MASK | AIR_CONDITIONER_SUPPORT_HEATING_MASK | \
                                                AIR_CONDITIONER_SUPPORT_AIR_CIRCULATION_MASK)   //默认空调支持的模式
#define TEMPERATURE_FLOOR_SET_DEFAULT           (25)                        //默认地暖设置温度
#define FRESH_AIR_SPEED_SET_DEFAULT             SET_WIND_SPEED_LOW          //默认新风风速
#define IS_LOW_TEMPERATURE_PROTECTED_DEFAULT    (0)                         //默认不支持低温保护
#define IS_ECONOMIC_MODE_DEFAULT                (0)                         //默认不开启节能模式
#define IS_AIR_BLOWER_CONTROLLED_DEFAULT        (1)                         //默认风机受控
#define IS_POWER_OFF_MEMORY_DEFAULT             (1)                         //默认掉点存储
#define BACKLASH_UPPER_LIMIT_DEFAULT            (1)                         //默认回差上限
#define BACKLASH_LOWER_LIMIT_DEFAULT            (-1)                        //默认回差下限
#define TEMPERATURE_UPPER_LIMIT_DEFAULT         (30)                        //默认温度上限
#define TEMPERATURE_LOWER_LIMIT_DEFAULT         (16)                        //默认温度下限
#define TEMPERATURE_UNIT_DEFAULT                TEMPERATURE_UNIT_CELSIUS    //设置温度单位
#define PRESENT_SYS_PAGE_DEFAULT                PAGE_AIR_CONDITIONER    //默认界面
#define MACHINE_TYPE_SUPPORTED_DEFAULT          MACHINE_TYPE_AIR_CONDITIONER//默认机型

#define IS_PARAMS_SAVED_FLAG_LOW                (0x3F)                      //存储器中已有参数标志位低8位
#define IS_PARAMS_SAVED_FLAG_HIGH               (0xF3)                      //存储器中已有参数标志位高8位

/* 通讯波特率 */
#define MODBUS_BAUDRATE_2400    1
#define MODBUS_BAUDRATE_4800    2
#define MODBUS_BAUDRATE_9600    3

/* 系统时基 */
#define SYS_TIMER_BASE          500 //us

/* 版本信息 */
#define SOFTWARE_VERSION        0x10     //V1.0

/* 阀输出状态 */
#define OUTPUT_STATUS_AIR_CONDITIONER_MASK      (1 << 0)
#define OUTPUT_STATUS_FLOOR_HEATING_MASK        (1 << 1)

/* 开关机状态 */
#define POWER_AIR_CONDITIONER_MASK              (1 << 0)
#define POWER_FLOOR_HEATING_MASK                (1 << 1)
#define POWER_FRESH_AIR_MASK                    (1 << 2)

/* 空调工作模式使能 */
#define AIR_CONDITIONER_MODE_SUPPORTED_COOLING_MASK             (1 << 0)
#define AIR_CONDITIONER_MODE_SUPPORTED_HEATING_MASK             (1 << 1)
#define AIR_CONDITIONER_MODE_SUPPORTED_AIR_CIRCULATION_MASK     (1 << 2)
#define AIR_CONDITIONER_MODE_SUPPORTED_DEHUMIDIFICATION_MASK    (1 << 3)

/* 空调使能(支持)模式 */
#define AIR_CONDITIONER_SUPPORT_COOLING_MASK            (1 << 0)
#define AIR_CONDITIONER_SUPPORT_HEATING_MASK            (1 << 1)
#define AIR_CONDITIONER_SUPPORT_AIR_CIRCULATION_MASK    (1 << 2)
#define AIR_CONDITIONER_SUPPORT_DEHUMIDIFICATION_MASK   (1 << 3)

/* 空调工作模式 */
enum 
{
    AIR_CONDITIONER_MODE_AIR_CIRCULATION = 0,   //通风模式
    AIR_CONDITIONER_MODE_COOLING,               //制冷模式
    AIR_CONDITIONER_MODE_HEATING,               //制热模式
    // AIR_CONDITIONER_MODE_COOLING_SLEEP,         //制冷+睡眠模式(s8系列不支持)
    // AIR_CONDITIONER_MODE_HEATING_SLEEP,         //制热+睡眠模式(s8系列不支持)
    AIR_CONDITIONER_MODE_DEHUMIDIFICATION,      //除湿模式  
};

/* 风速设定 */
enum
{
    SET_WIND_SPEED_AUTO = 0,                    //自动风速
    SET_WIND_SPEED_LOW,                         //低风速
    SET_WIND_SPEED_MEDIUM,                      //中等风速
    SET_WIND_SPEED_HIGH,                        //高风速
};

/* 风速输出 */
enum
{
    OUTPUT_WIND_OFF = 0,                        //风机不输出
    OUTPUT_WIND_SPEED_LOW,                      //低风速
    OUTPUT_WIND_SPEED_MEDIUM,                   //中等风速
    OUTPUT_WIND_SPEED_HIGH,                     //高风速
};

/* 温度单位 */
enum
{
    TEMPERATURE_UNIT_FAHRENHEIT = 0,            //华氏度
    TEMPERATURE_UNIT_CELSIUS,                   //摄氏度
};

/* 温控器机型 */
enum
{
    MACHINE_TYPE_AIR_CONDITIONER = 1,                   //空调
    MACHINE_TYPE_FLOOR_HEATING,                         //地暖
    MACHINE_TYPE_FRESH_AIR,                             //新风
    MACHINE_TYPE_AIR_CONDITIONER_AND_FLOOR_HEATING,     //空调+地暖
    MACHINE_TYPE_AIR_CONDITIONER_AND_FRESH_AIR,         //空调+新风
    MACHINE_TYPE_FLOOR_HEATING_AND_FRESH_AIR,           //地暖+新风
    MACHINE_TYPE_FULL_FUNCTION,                         //全功能
};

/* 继电器模式 */
enum
{
    RELAY_MODE_AIR_CONDITIONER = 1,                     //空调
    RELAY_MODE_FRESH_AIR_FLOOR_HEATING,                 //地暖新风
};

/* 当前界面(系统界面仅有3个界面，而共有6个界面) */
enum
{
    PAGE_AIR_CONDITIONER = 1,       //空调界面
    PAGE_FLOOR_HEATING,             //地暖界面
    PAGE_FRESH_AIR,                 //新风界面
    PAGE_ENGINEER,                  //工程师界面
    PAGE_ADVANCED,                  //高级界面
    PAGE_ERROR,                     //错误界面
};

/* 工程师模式菜单选项 */
enum
{
    ENGINEER_MENU_TEMPERATURE_CALIBRATION = 1,      //温度校准
    ENGINEER_MENU_MODE_ECONOMIC,                    //节能开关
    ENGINEER_MENU_AIR_BLOWER_CONTROLLED,            //风机控制
    ENGINEER_MENU_LOW_TEMPERATURE_PROTECTED,        //低温保护
    ENGINEER_MENU_POWER_OFF_MEMORY,                 //断电记忆功能
    ENGINEER_MENU_BACKLASH_UPPER_LIMIT,             //回差上限
    ENGINEER_MENU_BACKLASH_LOWER_LIMIT,             //回差上限
    ENGINEER_MENU_TEMPERATURE_UPPER_LIMIT,          //温度上限
    ENGINEER_MENU_TEMPERATURE_LOWER_LIMIT,          //温度下限
    ENGINEER_MENU_COOLING_SUPPORTED,                //制冷模式使能
    ENGINEER_MENU_HEATING_SUPPORTED,                //制热模式使能
    ENGINEER_MENU_AIR_CIRCULATION_SUPPORTED,        //通风模式使能
    ENGINEER_MENU_DEHUMIDIFICATION_SUPPORTED,       //除湿模式使能
    ENGINEER_MENU_TEMPERATURE_UNIT,                 //温度单位
    ENGINEER_MENU_COMMUNICATION_ADDR,               //通讯地址
    ADVANCED_MENU_VERSION_INFO = 51,                //版本信息    
    ADVANCED_MENU_BRADRATE,                         //波特率
    ADVANCED_MENU_MACHINE_SUPPORTED,                //机型支持
    ADVANCED_MENU_LUMINANCE,                        //背光亮度
    ADVANCED_MENU_RELAY_MODE                        //继电器模式
};

typedef struct 
{
    u16 btnPower : 2;
    u16 btnMode : 2;
    u16 btnWindSpeed : 2;
    u16 btnDown : 2;
    u16 btnUp : 2;
    u16 btnPage : 2;
    u16 reserved: 4;
}BTN;

typedef struct 
{
    u8 temperatureSmp;                  //室内温度
    u8 outputStatus;                    //输出状态
    u8 airConditionerSpeedOut;          //空调风速输出
    u8 freshAirSpeedOut;                //新风风速输出
    u8 powerStatus;                     //电源状态(空调/地暖/新风)
    u8 airConditionerMode;              //空调模式
    signed char temperatureAirSet;      //空调温度设定
    signed char temperatureFloorSet;    //地暖温度设定
    u8 airConditionerSpeedSet;          //空调风速设定
    u8 freshAirSpeedSet;                //新风风速设定
    u8 isBtnLocked;                     //按键锁
    u8 isLowTemperatureProtected;       //低温保护功能
    u8 isEconomicMode;                  //节电模式
    u8 isAirBlowerControlled;           //风机受控模式
    u8 isPowerOffMemory;                //断电记忆功能
    signed char temperatureCalibration; //温度校准
    signed char backlashUpperLimit;     //回差上限
    signed char backlashLowerLimit;     //回差下限
    signed char temperatureUpperLimit;  //温度上限
    signed char temperatureLowerLimit;  //温度下限
    u8 airConditionerModeSupport;       //空调模式使能
    u8 temperatureUnit;                 //温度单位
    u8 sysPage;                         //当前系统
    u8 machineTypeSupported;            //机型使能
}SYS_REGS;

typedef struct 
{ 
    SYS_REGS regs;                      //寄存器
    BTN btn;                            //按键状态
    u8 buzzer : 1;                      //蜂鸣器状态
    u8 isNoOperation : 1;               //按键无操作标志
    u8 isSaving : 1;                    //执行参数保存
    u8 presentPage : 3;                 //当前页面
    u8 reserved : 5;
    u8 commBradrate;                    //通讯波特率
    u8 backligntLevel;                  //背光亮度  
    u8 relayMode;                       //继电器工作模式
    u8 commAddr;                        //从机地址
    u8 advancedMenu;                    //高级/工程师菜单
    u8 isDisplayFlicker;                //是否显示闪烁
    u8 Fault;                           //系统错误
}SYS_PARAMS;

typedef struct
{
    u8 sysTimerFlag10ms : 1;
    u8 sysTimerFlag20ms : 1;
    u8 sysTimerFlag50ms : 1;
    u8 sysTimerFlag100ms : 1;
    u8 sysTimerFlag200ms : 1;
    u8 sysTimerFlag500ms : 1;
    u8 sysTimerFlag1000ms : 1;
    u8 sysTimerFlag2000ms : 1;
    u32 sysTimerCnt;
}SYS_TIMER;

extern SYS_TIMER __xdata sysTimer;
extern SYS_PARAMS __xdata sysParams;

extern void sys_timer_init(void);
extern void sys_func(void);
extern void sys_params_init(void);
extern void sys_params_saved(void);
extern void timer0_int (void) __interrupt TIMER0_VECTOR;
extern void print(u16 value);
extern void println(u16 value);
